作者:mobiledu2502859507 | 来源:互联网 | 2024-11-12 14:05
在日常开发中,Activity
和 Fragment
产生的内存泄漏问题非常常见。这些问题通常是因为这些组件在生命周期结束后仍然被其他对象引用,导致无法被垃圾回收器回收。Google 为此开发了 Jetpack
系列库,其中 Lifecycle
是一个非常重要的组件,旨在帮助开发者编写高质量、高性能的代码。
1. Lifecycle 简介
Lifecycle
组件的主要作用是让其他组件(如 Presenter
)能够感知到 Activity
或 Fragment
的生命周期变化,并在相应的生命周期回调中执行特定的操作。例如,在 MVP 架构中,Presenter
层需要感知 View
层(即 Activity
或 Fragment
)的生命周期,在 onDestroy
中取消网络请求或关闭数据库等。
Lifecycle
通过观察者模式实现这一功能,无需开发者手动重写 Activity
的生命周期回调方法。此外,Lifecycle
中没有对 Activity
或 Fragment
的直接引用,因此不会导致内存泄漏。
2. Lifecycle 用法
首先在 build.gradle
文件中添加依赖:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0'
接下来定义一个类继承自 androidx.lifecycle.LifecycleObserver
:
class MyCustomObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreateX() {
Log.d(TAG, "MyCustomObserver onCreate")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(owner: LifecycleOwner) {
Log.d(TAG, "MyCustomObserver onStart: $owner")
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onResume(owner: LifecycleOwner, event: Lifecycle.Event) {
Log.d(TAG, "MyCustomObserver onAny, $owner, $event")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
Log.d(TAG, "MyCustomObserver onDestroy")
}
companion object {
private val TAG: String = MyCustomObserver::class.java.simpleName
}
}
在 Activity
中注册生命周期观察者:
class MyCustomUI : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate method")
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart method")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume method")
lifecycle.addObserver(MyCustomObserver())
}
override fun onDestroy() {
Log.d(TAG, "onDestroy method")
super.onDestroy()
}
companion object {
private val TAG = MyCustomUI::class.java.simpleName
}
}
运行应用后,可以看到日志输出显示 MyCustomObserver
的生命周期方法在 Activity
的相应生命周期方法之后被调用。
3. Lifecycle 原理
Lifecycle
通过内置的 ReportFragment
监听 Activity
或 Fragment
的生命周期变化,并将这些变化分发给注册的 LifecycleObserver
。具体来说,ReportFragment
重写了 Fragment
的生命周期方法,并在每个方法中调用 dispatch
方法,将生命周期事件分发出去。
以下是 ReportFragment
的部分源码:
public class ReportFragment extends Fragment {
private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle.LifecycleDispatcher.report_fragment_tag";
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatch(Lifecycle.Event.ON_START);
}
@Override
public void onResume() {
super.onResume();
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
@Override
public void onStop() {
super.onStop();
dispatch(Lifecycle.Event.ON_STOP);
}
@Override
public void onDestroy() {
super.onDestroy();
dispatch(Lifecycle.Event.ON_DESTROY);
}
}
Lifecycle
将 Activity
的生命周期分为七个状态:INITIALIZED、CREATED、STARTED、RESUMED、PAUSED、STOPPED 和 DESTROYED。这些状态按照一定的顺序排列,以便于计算和管理。
LifecycleRegistry
类负责管理这些状态,并在收到 ReportFragment
分发的事件时,更新所有注册的 LifecycleObserver
的状态。具体来说,LifecycleRegistry
会根据当前的 Event
计算出新的 State
,并通知所有注册的 LifecycleObserver
更新其状态。
总结来说,Lifecycle
通过 ReportFragment
监听 Activity
或 Fragment
的生命周期变化,并通过 LifecycleRegistry
管理和分发这些变化,实现了高效、可靠的生命周期管理。